package cn.xiaolang.issue.support;

import lombok.ToString;

/**
 * 类加载过程
 * 1 加载非静态内容：把.class中的所有非静态内容加载到方法区下的非静态区域内
 * 2 加载静态内容：
 * 2.1 把.class中的所有静态内容加载到方法区下的静态区域内
 * 2.2 静态内容加载完成之后，对所有的静态变量进行默认初始化
 * 2.3 所有的静态变量默认初始化完成之后，再进行显式初始化
 * 2.4 当静态区域下的所有静态变量显式初始化完后，执行静态代码块
 * 3 当静态区域下的静态代码块，执行完之后，整个类的加载就完成了。
 *
 * @author Dean
 * @link { http://note.youdao.com/s/Tpql2eih }
 * @date 2021-02-01
 */
@ToString
public class ClassLoadProcessSample {

    private String name = "NONE";

    private String pwd;

    private static int count = 10;


    public ClassLoadProcessSample(String name, String pwd) {
        System.out.println("execute constructor");
        this.name = name;
        this.pwd = pwd;
        printUserInfo();
    }

    public void printUserInfo() {
        System.out.println("execute non static method:" + name + "#" + pwd);
    }

    public static int getCount() {
        System.out.println("execute static method:");
        count++;
        return count;
    }

    static {
        count++;
        System.out.println("execute static code：count=" + count);
    }

    {
        this.pwd = "888";
        System.out.println("execute constructor code: pwd=" + this.pwd);
    }
}

class ApplyDemo {
    public static void main(String[] args) {
        ClassLoadProcessSample dean = new ClassLoadProcessSample("dean", "123");
        System.out.println(dean);
    }
}